package com.zxtc.wh.service;

import com.zxtc.wh.pojo.resource.Resource;
import com.zxtc.wh.pojo.resource.SimpleResourceInfoBean;
import com.zxtc.wh.utils.Encrypt;

import java.io.*;
import java.sql.Timestamp;
import java.util.Objects;

/**
 * 2017年4月27日11:19:21
 */
public interface IResourceService {

    /**
     * 输出（拷贝、下载）资源
     *
     * @param uuid   资源的索引
     * @param output 资源的输出流
     */
    void download(String uuid, OutputStream output);


    /**
     * 新增写入一个资源
     *
     * @param inputStream 资源的输入流
     * @param simpleInfo  资源的基本信息
     * @return
     */
    Resource upload(InputStream inputStream, SimpleResourceInfoBean simpleInfo);


    /**
     * 通过资源的标识符找到资源在数据库中的索引记录，通过索引记录才可以读写资源的内容
     *
     * @param uuid 资源的标识符
     * @return 保存在数据库中的资源的记录
     */
    Resource getResource(String uuid);

    /**
     * 通过资源的索引读取资源的内容
     *
     * @param resource
     * @return
     */
    InputStream getInputStreamByResource(Resource resource);


    /**
     * 使用散列算法生成文件的摘要
     *
     * @return
     */
    static String hash(File file) {
        try {
            return Encrypt.SHA256(new FileInputStream(file));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 使用sha256散列算法生成文件的摘要
     *
     * @return
     */
    default SimpleResourceInfoBean resourceInfo(File file, String fileName) {
        Objects.requireNonNull(file);

        SimpleResourceInfoBean info = new SimpleResourceInfoBean();

        info.setResource_size(file.length());
        info.setResource_hash(
                hash(file));
        info.setResource_file_name(fileName);
        info.setResource_client_create_timestamp(new Timestamp(System.currentTimeMillis()));

        return info;
    }
}
